import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { login as userLogin, getUserInfo, logout as userLogout } from '../api/user'

export const useUserStore = defineStore('user', () => {
  // 用户令牌
  const token = ref(localStorage.getItem('token') || '')
  // 用户信息
  const userInfo = ref(JSON.parse(localStorage.getItem('userInfo') || '{}'))
  
  // 计算属性：是否已登录
  const isLoggedIn = computed(() => !!token.value)
  
  // 设置令牌和用户信息
  function setToken(newToken) {
    token.value = newToken
    localStorage.setItem('token', newToken)
  }
  
  function setUserInfo(info) {
    userInfo.value = info
    localStorage.setItem('userInfo', JSON.stringify(info))
  }
  
  // 登录方法
  async function login(loginData) {
    try {
      const res = await userLogin(loginData)
      
      // 检查响应状态
      if (res.code === 0 || res.code === 200) {
        // 登录成功，存储令牌和用户信息
        if (res.data && res.data.token) {
          setToken(res.data.token)
          // 如果有用户信息，也存储起来
          if (res.data.userInfo) {
            setUserInfo(res.data.userInfo)
          }
        }
        return res
      }
      
      // 处理登录失败
      throw new Error(res.message || '登录失败')
    } catch (error) {
      console.error('登录错误:', error)
      throw error
    }
  }
  
  // 获取用户信息
  async function fetchUserInfo() {
    try {
      const res = await getUserInfo()
      if ((res.code === 0 || res.code === 200) && res.data) {
        setUserInfo(res.data)
        return res.data
      }
      
      // 处理其他响应情况
      if (res.message) {
        throw new Error(res.message)
      }
      return null
    } catch (error) {
      console.error('获取用户信息错误:', error)
      if (error.response?.data?.message) {
        throw new Error(error.response.data.message)
      }
      return null
    }
  }
  
  // 登出方法
  async function logout() {
    try {
      await userLogout(); // 请求后端登出
    } catch (error) {
      // 可以弹窗提示，但不要阻止后续操作
      console.warn('后端登出失败:', error);
    } finally {
      // 无论成功失败都清除本地token
      token.value = '';
      userInfo.value = {};
      localStorage.removeItem('token');
      localStorage.removeItem('userInfo');
    }
  }
  
  return {
    token,
    userInfo,
    isLoggedIn,
    login,
    logout,
    fetchUserInfo,
    setUserInfo
  }
}) 